package com.qfedu.tantu.server;

import com.alibaba.fastjson.JSON;
import com.qfedu.tantu.bo.ChatBo;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 邢朋辉
 * @Date: 2022/4/21 11:08
 */
@Component//IOC创建对象
@Scope(scopeName = "prototype")//必须设置IOC创建对象的形式：多例
@ServerEndpoint("/chatserver/{name}")//标记这是WebSocket,设置地址
public class WebSocketServer {
    private String name;
    //存储 在线用户 线程安全在JUC下
    public static ConcurrentHashMap<String,Session> users=new ConcurrentHashMap<>();
    @OnOpen//创建连接
    public void open(Session session, @PathParam("name") String name) throws IOException {
        //验证用户名是否存在
//        if(users.containsKey(name)){
//            //回复消息
//            session.getBasicRemote().sendText(createMsg("亲，"+name+"已经存在！"));
//        }else{
            //可以连接
            users.put(name,session);
            this.name=name;
            sendMoreMsg(createMsg("你好，请问有什么可以帮忙的吗"));
        }
//    }
    @OnMessage
    public void receive(Session session,String msg){
        ChatBo bo= JSON.parseObject(msg,ChatBo.class);
        System.err.println(msg);
        switch (bo.getType()){
            case 1://群聊
                sendMore(bo);break;
            case 2://单聊
                sendMsg(bo);break;
            case 3://系统消息
                sendMoreMsg(msg);break;
        }
    }
    @OnClose
    public void close(Session session){
        System.err.println("关闭连接");
    }
    @OnError
    public void error(Session session,Throwable throwable){
        System.err.println("出错啦:"+throwable.getMessage());
    }
    //群发消息
    public static void sendMoreMsg(String msg){
        //1，循环遍历在线用户
        users.keySet().forEach(s->{
            try {
                //发送消息
                users.get(s).getBasicRemote().sendText(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
    public void sendMore(ChatBo bo){
        //1，循环遍历在线用户
        for(String s:users.keySet()){
            if(s.equals(name)){
                bo.setSelf(true);
                System.err.println(bo);
            }
            //发送消息
            try {
                users.get(s).getBasicRemote().sendText(JSON.toJSONString(bo));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //发送单聊消息
    public static void sendMsg(ChatBo bo){
        //1，循环遍历在线用户
        users.keySet().forEach(s->{
            try {
                //查询 单聊的对象
                if(s.equals(bo.getName())){
                    //发送消息
                    users.get(s).getBasicRemote().sendText(JSON.toJSONString(bo));
                    return;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
    //生成系统消息
    public static String createMsg(String msg){
        return JSON.toJSONString(new ChatBo("",msg));
    }
}
